package com.platform.framework.util.pub;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.log4j.Logger;

import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;

/**
 * 2016/11/7
 * @author ly-liugaoyang
 * 反射工具类
 */
@SuppressWarnings({"unchecked","rawtypes"})
public class ReflectUtil {
	
	private static Logger logger = Logger.getLogger(ReflectUtil.class);

	/**
	 * vo持久化为库表，vo包括一切内存中的对象，在本支付平台中包括result跟vo。
	 * @param t	要持久化的库表类
	 * @param vo 内存中的Vo
	 * @return
	 */
	public static <T> T voPersistence (T t,Object vo) {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.registerJsonValueProcessor(Date.class,new JsonDateValueProcessor());
		JSONObject json1 = JSONObject.fromObject(vo,jsonConfig);  
		Map<String, Object> map = json1;
		setVal(map, t);
		return t;
	}
	
	
	/**
	 * 根据json键名给obj的同名字段赋json值
	 * @param map
	 * @param obj
	 */
	public static void setVal (Map<String, Object> map,Object obj) {
		
		for (Entry<String, Object> entry : map.entrySet()) {  
            logger.info(entry.getKey()+"="+entry.getValue());  
            Field[] fields = obj.getClass().getDeclaredFields();
            for(int i=0;i<fields.length;i++) {
            	if (entry.getValue()==null || entry.getValue().toString().trim().equals("") || entry.getValue().toString().startsWith("[")) {
            		continue;
            	}
            	
            	if (fields[i].getType().equals(String.class)) {
            		if (fields[i].getName().equals(entry.getKey())) {
            			setFieldValueByName(fields[i].getName(), obj,entry.getValue(),String.class);
            		}
            	} else if (fields[i].getType().equals(Date.class)) {
            		if (fields[i].getName().equals(entry.getKey())) {
            			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
            			Date date = null;
            		    try {
							date = sdf.parse(entry.getValue().toString());
						} catch (ParseException e) {
							e.printStackTrace();
						}  
            			setFieldValueByName(fields[i].getName(), obj, date, Date.class);
            		}
            	} else if (fields[i].getType().equals(Long.class)) {
            		if (fields[i].getName().equals(entry.getKey())) {
            			setFieldValueByName(fields[i].getName(), obj, entry.getValue(), Long.class);
            		}
            	}
            }
        }
	}
	
	/**
	 * 根据属性名set属性值
	 * @param fieldName 属性名
	 * @param obj 对象
	 * @param arg 属性值
	 * @param c 属性类型
	 * @return
	 */
    public static void setFieldValueByName(String fieldName, Object obj,Object arg,Class c) {
       try {
           String firstLetter = fieldName.substring(0, 1).toUpperCase();
           String setter = "set" + firstLetter + fieldName.substring(1);
           Method method = obj.getClass().getMethod(setter, new Class[] {c});
           method.invoke(obj, new Object[] {arg});
       } catch (Exception e) {
    	   e.printStackTrace();
       }
    }
    
    /**
     * 执行一个方法
     * @param methodName
     * @param obj
     * @param arg
     * @param c
     */
    public static Object excuteMethod(String methodName, Object excutor,Object arg,Class argClass) {
        try {
            Method method = excutor.getClass().getMethod(methodName, new Class[] {argClass});
            return method.invoke(excutor, new Object[] {arg});
        } catch (Exception e) {
     	   e.printStackTrace();
     	   return null;
        }
     }
    
    
    /** 
     * 获取属性名数组 
     * */ 
    public static String[] getFieldName(Object o){  
        Field[] fields=o.getClass().getDeclaredFields();  
            String[] fieldNames=new String[fields.length];  
        for(int i=0;i<fields.length;i++){  
            System.out.println(fields[i].getType());  
            fieldNames[i]=fields[i].getName();  
        }  
        return fieldNames;  
    }
	
}
